{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3aa35ac5",
   "metadata": {},
   "source": [
    "## SETUP"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "43a1ed5b",
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install dezero\n",
    "!pip install dezerogym"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cda5c128",
   "metadata": {},
   "source": [
    "## ch07/dezero1.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "29143269",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "variable(32)\n",
      "variable([[19 22]\n",
      "          [43 50]])\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from dezero import Variable\n",
    "import dezero.functions as F\n",
    "\n",
    "# Inner products\n",
    "a = np.array([1, 2, 3])\n",
    "b = np.array([4, 5, 6])\n",
    "a, b = Variable(a), Variable(b)  # Optional\n",
    "c = F.matmul(a, b)\n",
    "print(c)\n",
    "\n",
    "# Matrix product\n",
    "a = np.array([[1, 2], [3, 4]])\n",
    "b = np.array([[5, 6], [7, 8]])\n",
    "c = F.matmul(a, b)\n",
    "print(c)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "241953dd",
   "metadata": {},
   "source": [
    "## ch07/dezero2.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "48add954",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "variable(0.9944984367782456) variable(0.9890050527419593)\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from dezero import Variable\n",
    "\n",
    "def rosenbrock(x0, x1):\n",
    "    y = 100 * (x1 - x0 ** 2) ** 2 + (x0 - 1) ** 2\n",
    "    return y\n",
    "\n",
    "x0 = Variable(np.array(0.0))\n",
    "x1 = Variable(np.array(2.0))\n",
    "\n",
    "lr = 0.001\n",
    "iters = 10000\n",
    "\n",
    "for i in range(iters):\n",
    "    y = rosenbrock(x0, x1)\n",
    "\n",
    "    x0.cleargrad()\n",
    "    x1.cleargrad()\n",
    "    y.backward()\n",
    "\n",
    "    x0.data -= lr * x0.grad.data\n",
    "    x1.data -= lr * x1.grad.data\n",
    "\n",
    "print(x0, x1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a8388302",
   "metadata": {},
   "source": [
    "## ch07/dezero3.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "5c664301",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "42.296340129442335\n",
      "0.24915731977561134\n",
      "0.10078974954301652\n",
      "0.09461859803040694\n",
      "0.0902667138137311\n",
      "0.08694585483964615\n",
      "0.08441084206493275\n",
      "0.08247571022229121\n",
      "0.08099850454041051\n",
      "0.07987086218625004\n",
      "====\n",
      "W = [[2.11807369]]\n",
      "b = [5.46608905]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from dezero import Variable\n",
    "import dezero.functions as F\n",
    "\n",
    "# トイ・データセット\n",
    "np.random.seed(0)\n",
    "x = np.random.rand(100, 1)\n",
    "y = 5 + 2 * x + np.random.rand(100, 1)\n",
    "x, y = Variable(x), Variable(y)  # 省略可能\n",
    "\n",
    "W = Variable(np.zeros((1, 1)))\n",
    "b = Variable(np.zeros(1))\n",
    "\n",
    "def predict(x):\n",
    "    y = F.matmul(x, W) + b\n",
    "    return y\n",
    "\n",
    "def mean_squared_error(x0, x1):\n",
    "    diff = x0 - x1\n",
    "    return F.sum(diff ** 2) / len(diff)\n",
    "\n",
    "lr = 0.1\n",
    "iters = 100\n",
    "\n",
    "for i in range(iters):\n",
    "    y_pred = predict(x)\n",
    "    loss = mean_squared_error(y, y_pred)\n",
    "\n",
    "    W.cleargrad()\n",
    "    b.cleargrad()\n",
    "    loss.backward()\n",
    "\n",
    "    W.data -= lr * W.grad.data\n",
    "    b.data -= lr * b.grad.data\n",
    "\n",
    "    if i % 10 == 0:\n",
    "        print(loss.data)\n",
    "\n",
    "print('====')\n",
    "print('W =', W.data)\n",
    "print('b =', b.data)\n",
    "\n",
    "# Plot\n",
    "plt.scatter(x.data, y.data, s=10)\n",
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "t = np.arange(0, 1, .01)[:, np.newaxis]\n",
    "y_pred = predict(t)\n",
    "plt.plot(t, y_pred.data, color='r')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1e73d25a",
   "metadata": {},
   "source": [
    "## ch07/dezero4.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "affa82cc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8165178492839196\n",
      "0.24990280802148895\n",
      "0.24609876581126014\n",
      "0.2372159081431807\n",
      "0.20793216413350174\n",
      "0.12311905720649353\n",
      "0.07888166506355149\n",
      "0.07655073683421636\n",
      "0.0763780308623822\n",
      "0.07618764131185574\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from dezero import Model\n",
    "from dezero import optimizers\n",
    "import dezero.layers as L\n",
    "import dezero.functions as F\n",
    "\n",
    "# Dataset\n",
    "np.random.seed(0)\n",
    "x = np.random.rand(100, 1)\n",
    "y = np.sin(2 * np.pi * x) + np.random.rand(100, 1)\n",
    "\n",
    "lr = 0.2\n",
    "iters = 10000\n",
    "\n",
    "class TwoLayerNet(Model):\n",
    "    def __init__(self, hidden_size, out_size):\n",
    "        super().__init__()\n",
    "        self.l1 = L.Linear(hidden_size)\n",
    "        self.l2 = L.Linear(out_size)\n",
    "\n",
    "    def forward(self, x):\n",
    "        y = F.sigmoid(self.l1(x))\n",
    "        y = self.l2(y)\n",
    "        return y\n",
    "\n",
    "model = TwoLayerNet(10, 1)\n",
    "optimizer = optimizers.SGD(lr)\n",
    "optimizer.setup(model)\n",
    "\n",
    "for i in range(iters):\n",
    "    y_pred = model(x)\n",
    "    loss = F.mean_squared_error(y, y_pred)\n",
    "\n",
    "    model.cleargrads()\n",
    "    loss.backward()\n",
    "\n",
    "    optimizer.update()\n",
    "    if i % 1000 == 0:\n",
    "        print(loss.data)\n",
    "\n",
    "# Plot\n",
    "plt.scatter(x, y, s=10)\n",
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "t = np.arange(0, 1, .01)[:, np.newaxis]\n",
    "y_pred = model(t)\n",
    "plt.plot(t, y_pred.data, color='r')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1bbfc669",
   "metadata": {},
   "source": [
    "## ch07/q_learning_nn.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "f3865e44",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEGCAYAAAB/+QKOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAq5ElEQVR4nO3deZxcVZ338c+vq7eks2+AWUhYFGFQ1Agibo8oIjg6Cyq4oTIPoy+Z0XF0JoyIDjIPuA2DigoqjgKKbAMZWcK+k6QTkkAWAtnTnT2d3teqOs8f91b3rapb1VXdtfTyfb9eeaXq3HOrTtWtPr97lnuuOecQERFJVVHuAoiIyMikACEiIqEUIEREJJQChIiIhFKAEBGRUJXlLkChzJo1yy1cuLDcxRARGVVWr159yDk3O2zbmAkQCxcuZNWqVeUuhojIqGJmOzNtUxeTiIiEUoAQEZFQChAiIhJKAUJEREIpQIiISCgFCBERCaUAISIioRQgSuzV/W2s3N5U7mKIiAxqzFwoN1qcc93TAOy49vwyl0REJDu1IEREJJQChIiIhFKAEBGRUAoQIiISSgFCRERCKUCIiEgoBQgREQmlACEiIqEUIEREJJQChIiIhFKAEBGRUAoQIiISSgFCRERCKUCIiEgoBQgREQlV1ABhZuea2WYz22JmS0K2f93MNprZS2b2mJkdG9h2sZm95v+7uJjlFBGRdEULEGYWAW4APgycDFxkZienZFsDLHbOvQm4C/iBv+8M4DvAGcDpwHfMbHqxyioiIumK2YI4HdjinNvmnOsFbgc+FszgnHvCOdfpP10OzPMffwh4xDnX5Jw7AjwCnFvEsoqISIpiBoi5wO7A8wY/LZNLgAeHuK+IiBTYiLgntZl9BlgMvDfP/S4FLgVYsGBBEUomIjJ+FbMF0QjMDzyf56clMbMPAN8CPuqc68lnX+fcTc65xc65xbNnzy5YwUVEpLgBoh440cwWmVk1cCGwNJjBzN4C3IgXHA4ENi0DzjGz6f7g9Dl+moiIlEjRupicc1EzuwyvYo8ANzvnNpjZVcAq59xS4IfAJOBOMwPY5Zz7qHOuycy+hxdkAK5yzjUVq6wiIpKuqGMQzrkHgAdS0q4MPP5Aln1vBm4uXulERCQbXUktIiKhFCBERCSUAoSIiIRSgBARkVAKECIiEkoBQkREQilAiIhIKAUIEREJpQAhIiKhFCBERCSUAoSIiIRSgBARkVAKECIiEkoBQkREQilAiIhIKAUIEREJpQAhIiKhFCBERCSUAoSIiIRSgBARkVAKECIiEkoBQkREQilAiIhIKAUIEREJpQAhIiKhFCBERCSUAoSIiIRSgBARkVAKECIiEkoBQkREQilAiIhIKAUIEREJpQAhIiKhFCBERCSUAoSIiIRSgBARkVBFDRBmdq6ZbTazLWa2JGT7e8zsRTOLmtkFKdtiZrbW/7e0mOUUEZF0lcV6YTOLADcAHwQagHozW+qc2xjItgv4PPCNkJfocs6dVqzyiYhIdkULEMDpwBbn3DYAM7sd+BjQHyCcczv8bfEilkNERIagmF1Mc4HdgecNflquas1slZktN7O/CstgZpf6eVYdPHhwGEUVEZFUI3mQ+ljn3GLgU8B/mdnxqRmcczc55xY75xbPnj279CUUERnDihkgGoH5gefz/LScOOca/f+3AU8Cbylk4UREJLtiBoh64EQzW2Rm1cCFQE6zkcxsupnV+I9nAWcRGLsQEZHiK1qAcM5FgcuAZcAm4A7n3AYzu8rMPgpgZm83swbg48CNZrbB3/2NwCozWwc8AVybMvtJRESKrJizmHDOPQA8kJJ2ZeBxPV7XU+p+zwOnFrNsIiKS3UgepBYRkTJSgBARkVAKECIiEkoBQkREQilAiIhIKAUIEREJpQAhIiKhFCBERCSUAoSIiIRSgBARkVAKECIiEkoBQkREQilAiIhIKAUIEREJpQBRJs65chdBRCQrBQgREQmlAFEmakCIyEinACEiIqEUIMpEDQgRGekUIGTM2XqwnQ17WspdDJFRr7LcBRivvFlMVu5ijEln//gpAHZce36ZSyIyuqkFISIioRQgykRjECIy0uUUIMzsq2Y2xTy/MbMXzeycYhdORETKJ9cWxBedc63AOcB04LPAtUUr1Tig6yBEZKTLNUAkRlPPA25xzm1AI6wiImNargFitZk9jBcglpnZZCBevGKNfU6jECIywuU6zfUS4DRgm3Ou08xmAF8oWqlERKTscm1BnAlsds41m9lngCsAXYk0DBqDEJGRLtcA8Qug08zeDPwzsBX4fdFKJSIiZZdrgIg679LfjwE/c87dAEwuXrFERKTcch2DaDOzy/Gmt77bzCqAquIVS0REyi3XFsQngR686yH2AfOAHxatVCIiUnY5BQg/KNwGTDWzjwDdzjmNQQyDBqlFZKTLdamNTwArgY8DnwBWmNkFxSyYiIiUV65jEN8C3u6cOwBgZrOBR4G7ilWwsU4XyonISJfrGERFIjj4Dueyr5mda2abzWyLmS0J2f4ef+G/aGqLxMwuNrPX/H8X51hOEREpkFxbEA+Z2TLgj/7zTwIPZNvBzCLADcAHgQag3syWOuc2BrLtAj4PfCNl3xnAd4DFeCtjr/b3PZJjeUek5s7e/scagxCRkS6nAOGc+6aZ/S1wlp90k3PufwbZ7XRgi3NuG4CZ3Y53HUV/gHDO7fC3pa7r9CHgEedck7/9EeBcBgLUqPSRnz5b7iKIiOQs51uOOufuBu7O47XnArsDzxuAM4ax79zUTGZ2KXApwIIFC/IoWnk0HOnqf6wGhIiMdFkDhJm1EV6XGeCcc1OKUqocOeduAm4CWLx4sepcEZECyhognHPDWU6jEZgfeD7PT8t13/el7PvkMMoy4jgNQojICFfMe1LXAyea2SIzqwYuBJbmuO8y4Bwzm25m0/HuZLesSOUUEZEQRQsQzrkocBlexb4JuMM5t8HMrjKzjwKY2dvNrAHvArwbzWyDv28T8D28IFMPXJUYsB4r1H4QkZEu50HqoXDOPUDKdFjn3JWBx/V43Udh+94M3FzM8omISGbF7GIad+p3NHH5PS/nNL6gIQgRGekUIAro4798gT+u3FXuYoiIFIQCRBHk1DpQC0JERjgFiCJQ3S8iY4ECRBHkNAYxxDBysK2H//OjJ9lxqGNI+4uI5EoBogiK2YK4/6U9bD/UwW+f217EdxERUYAoilzGIDSLSURGOgWIItDNgERkLFCAKIKcWhDFL4aIyLAoQIiISCgFiDy0dvdx/L89wBObD2TNl9sYhNoQIjKyKUDk4dV9bcTijp89viVrPo1BiMhYoABRBBqDEJGxQAGiCFT5i8hYoACRh1wrfq3mKiJjgQJEEajuF5GxQAEiD5ZjvtzGIBRGRGRkU4AIMewpqKr7RWQMUIBIsb+1m0WXP8Ad9buH/Bo5tQ4URERkhFOASPHa/nYA7l3bmLYt1zp9+6EOXm5oKWCpRERKr7LcBRgpnttyiDmTa+iLxwGojAw9dv71z58HYMe152fMowaEiIx0ChC+T/96BQC/+txiAKoq0oekcx2kLgUFGBEpNnUxpYjGEi2I4oaDoY6Dm5UuTD348t5hjcWIyOimFkSKvrhXcw+ni2ms+PJtLwLwibfPL3NJRKQcVAumSLQgwrqYCtmto+sgRGSkU4BIEY2pBSEiAgoQaRKzmKpCxiAK2fuvtZhEZKRTgEiRaEFEQrqYRETGEwWIFFF/kLqiyLOFRlsDoi8Wp7svVu5iiEgJKUCkiPsBIqwLaLRV6oX0lz99lpO+/VC5iyEiJaQAkSKWw+BAIdoWo+2e1K/sayt3EUSkxBQgUsQSLYgs7YXRVbWLiAyNAgQD3UoQCBAhUSDflsOB1u6M20ZZA0JExiEFCJK7lWLx3GvuO+p3s3DJ/fRG46HbL/ndqmGXTUSkXBQgSA4KcT9YhMWJ1KRrHtwEQHtPNPR1mzp6C1I+EZFyKGqAMLNzzWyzmW0xsyUh22vM7E/+9hVmttBPX2hmXWa21v/3y2KWMxbSxRSLh7cKYKCrKbHbYJdM3Le2kYVL7h9OEUVE+rX3RJO6xoulaAHCzCLADcCHgZOBi8zs5JRslwBHnHMnANcB3w9s2+qcO83/96VilRNSuphcIkCk50tkS+ROtDZskNGJm5/bkfG1RETy0dLZx198ZxnXPfpq0d+rmC2I04Etzrltzrle4HbgYyl5Pgb8zn98F3C2lXI9a18wEseztCBSp6bmWsnXVKonbzR4dON+Fi65n+ZOdQ3KyNXk/z7/d92eor9XMWuuuUDwZgINflpoHudcFGgBZvrbFpnZGjN7yszeHfYGZnapma0ys1UHDx4cckGTu5j8//2k+9Y28tD6vUD6GITrH6/IHilqqyJpaVrNdeS58emtALzq33ZWZLwbqae2e4EFzrm3AF8H/mBmU1IzOeducs4tds4tnj179pDfLGyQOtGC+Orta/nSrS/675e8XzylyymTYrQg1EVVePpORZIVM0A0AsE7zczz00LzmFklMBU47Jzrcc4dBnDOrQa2Aq8vVkHDprn2xdJrC9c/5uCJD6cFocpIREa4YgaIeuBEM1tkZtXAhcDSlDxLgYv9xxcAjzvnnJnN9ge5MbPjgBOBbcUqaFIXk19zt3T1peVzqf/7DwYNEAVsQZR+hGb80Hcrkqxotxx1zkXN7DJgGRABbnbObTCzq4BVzrmlwG+AW8xsC9CEF0QA3gNcZWZ9QBz4knOuqVhlDY5HJwapUwcqO3ujIV1M2fuYGpu76I3GqalKDxCDBRURkTClXMetqPekds49ADyQknZl4HE38PGQ/e4G7i5m2YLCupiaOpJbEN/78ybOO/XopLSB6a6ZX7u5s5fqSNggtYw0itkiyUbqIHVJBae0JoLFkc7epEh9pKM3YwtisNZA2IV0o20111zsbelKu3rcOcfX71jLi7uOlKlU+VNXk4xkpbwSQAGC5IviBq6DcHT3JV8LEU8ZpB6khymrElwEWXJnXvM4b/3eI0lprV1R7nmxkc/fvLJMpcrfGIzdMoaU8uRSAYLUQeqB9OAaS2aZA8FQLnnXGETx5fuHpJaDSDIFCJIr62B3U2qAIEOLYbB6KKziybLU04hWivVfCkUxWGR4FCAIX6wPoCNlldZMVz8PdlV0WEU1WlsQo7XcuRjDH03GkFL+TBUggGjIUhsAbd0pASLDkcl2Up1p02itjPJtQJRzSZGhvrO6mmQk0xhEiQXPiuPOUR3xvpaGI5396Yb1V46p9Ue2s2rnMnQx5XiQl23Yx5ObD+SUtxTybUGUs0dqqH9IozV4y/hQyr8pBQiSu5W6emOcdMxkpk6oYs3u5qR8mSqcbBVKpgo114r2729Zzed/W9//fNPe1kH32XGogw17WnJ6/XzlHyCG/mvetLc1rZsvH/m+s1oOMhqU8gRGAYLkgdcXth0mUmFMn1iV3sWU8n9/epYjljlA5F/OLQfa+OPK3YPme9+PnuT8nzyb/xvkIJ9bssLQA0RPNMaHr3+GL9/24pD2Hwq1HGQ0KOU4oAIEyVdSA1RVVFBXU0ln8OzVhjgG4cIvbBlK98eBtp689ym0fANbYrZWa3d+LYFEIKrfPvQVVob6d6SWhIxkChAlFk2p9WqrI9RVV9LRmzpInXyhXH96ls6MQrYgyiXYwso3sAU//6H23ANcIf4GhjpArpaEjGTqYiqx1Ln9E6oqmFgToblzYD2mwGUQIftnee2MrY78jnJzZy//9chree1TKGFrVeUq+DnDVsjNZb+hGupLjMVlUGTsUIAosdRKb0JVhLqaSl7Z15aUnjgw2w51cPp/PNqfnq0yG+4gdcKV921g5Y78ulv6YnFufGorvdHhXZWXfEOl/PYd6o+5nC2s0dS6k/GnlF1MRV3NdbRI/cInVEeoDqklEl0WqQvSZeOcCz0jzXaMmzt72dXUyZvmTetP6+yN5fyeCb9/YSfXPPgKDvjSe4/Pe/+EWIG6mPLar4S19N6WLtY3DswO0+1gZSRTgCixWMoJdm1VJLQCzzxIna0FEX5Gmm2fT964nM3729hx7fkZ8+RSiSWmiA5lqmhwn6QLCUt0HUTi+xlOZZ1rUf/m58+zt6WbxcdOz2s/kXIo5c9TAQKIpgwiTKiKpM1kMbMhDTjHnQutcLL15W/e35ZxW6mc95Nn+h/Hh9HFNNSznXwD0XDsbekGgvf3UISQkat/skwJptspQBDSxVQVIRJJ/vKzHYqs10HEwyucXOqgcg6W7jw8cBV5sAWRb9dP8DPk83ESMduyfvODvHee51qJoK0xCBnJEr/PUtQPGqQmvYtpUm0lVRXpX81QroOIZxiDyOUsNVsr49bluwbdv1BSlyLJb9/hv+dQ5fsSie9bs5hkJNMsphJLPSueUVdNW0i/fcbVXAdZiylsay4VZym7WbJJXsxwaGflkF/Fm+/7hMn3FQYCxLDfWqRodKFciaVeKDezroa27vQ5+5mOS7bDFXcu9IDGnWPn4Q5WZrlSeKTcMyIWG3qASLrXRsj3cLi9h9tXpreGBu7WV7o/hlxvIStSTgoQJZZacc2oq+aLZy1KSjPLctFblkrTCxDp6c453vvDJ/nEjS/kWK7h/Si6emN8/U9r87qaOaEvEKkSwbStu4+FS+7nnhcbsu4b/AhhweUf/riGJfe8zI5DHUnphWg95dtVpDEIGQ3UxVRiaVdSV0eYP2Nich6XucLJPgaR6YZBg5creOY+XPeubeSeNY388KHNee8bDZQj8bixuQuAG5/alnXfpPGLkBbRQX99qdSZZAUZg8gz/2sH2r39Ut774ptX8utnsn9OkVJRgCix1DPbyor0mTNxl7mzI1s3SKYL5XIapE7KM4zZPIGXGcrMuL7AKH5fnv1ewa928/42TrvqYfa2dGXM39jcxcIl9/PAS3vzLmeqQl3F/dSrB7n6/k30xeLsac5cdpFSSNQdpZjmqgBBemVdXel9Le8/aU5yxkxjEIO0IMLHIAYeL1xyP9/6n5fT8hRioLYQguVItCBSxwgyt64G0n//wg6aO/tYtn5fxvfa0Ojdx+KO1d6y5sOZ5jpUmT7Lv93zMu+89vFh3aNCZLj6LyLVNNfSSB2kTrQglnz4pP60uupIxpZC9jvKhV8ol3pwb1uxK23NpHy6WdY3trA25QZHmdxRv5u7VmcfOwgKdv9EU+cE+zLFsrDrIMLHZJKf727yztRzGaRu74mGL39SoBZEwmOveHf26+iJ0hPNf+kTkUJQF1OJpXUx+bccnVQzcB3hgy/vy1IJZn7tfJbaSC3HYC2I4NjJR376LH91w3NJ2zOde//L3S/xjTvXZX3toL7AGERfPNG8TbyH9yCXq8wTlf1gLap8vfcHT/DW7z2Slj7UGVBJM69CCvaJG1/gDVc8NKTXFhmuxO9aXUwlEk0ZDK7yr6J+3bQJ3PZ3ZwDQ1hPlcIYZQIO3IEIqxJAT8dTbhAYrp0c37U8v92ABpEBnGsmD1F7BE+XPVul7+dLT8116ZDCHMyyeOOTlvgOPw1bC3eFfZb5pbys/e7w8S7DL+FXK6e/jPkA0d/Zy3aOvJqVVRQa+lrNOmMUbjpoMwMMb0ytpGLwFEbb5yVcPpqVd8MvkKa8bB7n/9GCVaqEutAsOTCdaE6mzjjK9VSykiymsXLF46c6KBhMM6MEAkVqyv/75c/zo4Vfpicb48q2rWbPrSIlKKOOZxiDKLHUW00NfezcLZkzkpYaW0PyD3VEu7Oz6lQyVf7Av/e9vWZ21nKmVdNp7x9Mr56FIakH475lovQzWxRQ+xTc9MfG6hQwPQ/3IwfJlG2vo7vPKvOtwJw+u38dlf1gzxHcUyV0pp66M+wBRUxlJS0s9izUz/uq012V8jex3lAu/UC5ThRrWlz6U94XCtSCCA9OJYJHaesnlznn9M58K3MWUyVDPsILfa08ON1vq9b+fxuYuXv+tB9O2N3f20tyZ+z1ERLIp5WquChCVuX0Fnz1zYcZt2ccgwiuqQtTdb7v6EdqzTLkMlivxW+oYwo2HuvoG9umLxXHO8XG/O2zQMYikQWo/LSQYJLquUrckWiirdx7hzGseozVkCZRCC5Yh2ILIdMi6A99Pr//9BJ121SOcdlXugT9r2Zzjic0HtKDgOKbVXEuoIuSiuDCzJ9dw6typoduyHaZM94MoxJXC0bjL2FUFAxWx2UBA+t91ezLm33W4k6/dviatWyUYIKJxF3pWnWm5kVxnLCVaELHUsQ3/2/3PRzazt6WbtbuaM5Y/VWG6mAZvQbT3JH9fuewT5uWGFl7YejhrnjtXNfCF39ZzZw7TlNu6+zQddwzSWkwj1F1fPrN/hlNQ1vtBuMJP6wzK1srMcMlCRt+692XuXbsnrZJK9LWD193U0xccuE2MQYS/Zq5XkSfGIPqGsbzI1oPtKe+dOe/eli4+/svnWd+YPq4ULPO9axoHfd/27uRWXLBFkY+//NmzXPSr5VnzNBzxZlA1Hhn8iu5Tv/swn/rVitBtv35mG0+HTJQYjmgszl2rGzJeKyOFkfh5qotphKmpjHDF+SenpQ/ljnKlOAsYbCXVXHWntCCCLYqwLqb1jS189jcr6O6LJfXnJ1bIzXYNyGAD76mCS1+c/eOn2BYIEomydffFuPT3q9hyYGDbxj2t1O84wpX3rU97zbiD3U2d/P0tq/jVM9v70zP9Obb3JHd7dQ0xQBTD6p3hM6uuvn8Tn7t5ZUHf6+GN+/nGnev4yWOa+ltMakGMYB88+ai0tGzHy2WYxdSQwxlgLrJ1ZyQqW+cyXwH96v42OnuzLx0RDBA90Ti3Lt+Zlif4Gb9x5zqeee0QWw60J6UnPnNnyDhIYlZUagsi8TzRUgluXbe7mXde+3hS/vf/+Km011614wgPb9zPFfcOLGeSGIsJO3TOwX/cv4llG8KnNadqS2lBdA0yzvPNO9fxH/dvBLyB7YYjnUnH59fPbGP5tuxdTYPJ985/hbRyR+Yl7AuhfkcTi69+lJbOwcejunpjY268RldSj2CvmzaBHdeez4Vvn9+flu2MMdOV1IXyqV+tYFXgDzL4x9AXHTi7D5sl1BONcc51T/OPf1yblN7SlXJGHKjwbnlhJz97Ykv/8/6KO/Dyr+zz7qkdjYfP4GrtSv/DTsyOSr1osf8mPn5V/nJDc/+2Qe/dneV7T3QL5dq6y9aav/7R5DPm4O/hmgc2peW/c3VDf8vkrGsf513ff4J3ff+J/u1X37+JC29aznWPvMpTrx5kyd0vZX5z4Pkth7h1+U5uenprf4uhM8tvslhdQIk1qoq9htgPl23mUHsP6/eETztPWLe7mTde+RC/fW5H1nwvNTSzu6kza56g7y7dwKcG6QosplLeI6WoAcLMzjWzzWa2xcyWhGyvMbM/+dtXmNnCwLbL/fTNZvahYpYzaPUVH8gp3zV/cyq3X/oOJtVUcsW9L/ODh14JzedVNsU9oL8OdIMkLYvhVwQx50L79g+1e1MvH920v3/ZbYCv3r42KV+3P9A5bWJV/zLfCdlmMbV29YWevaWeccNAayd1kDrVjx5+tX/K6GBnhomtvbH0yjLbgnvOubSAUB3J/KeSevfBRIuruy/GjU/ntkz4vtbutLTrH3uNi29eye31u7OW91O/XsEV967n/z3wCn/7i+d5eMM+9mVZMbcjMKi+eucRvvKHFwcNGq3+/T/uXdPIl29dzdtCpmMnZtSlXuG/41AHNz29tWBn8ongPlgg2uyfqDz9Wvaxlo/+7Dne/QMvQK/eeYSr/7wxa/7/fn4Hz289zD/fsW7QwHLbip3sPNyRNU9CTzSWNKmgszea8yoMxVI5eJahMbMIcAPwQaABqDezpc654Ld/CXDEOXeCmV0IfB/4pJmdDFwInAK8DnjUzF7vnCtq5+4bj5nCzEk1OeU1M95x3Ewe/fp7ufr+jfziqa2h+Vq6+oY18JqLYOUcnPaaeByPu9CK98cPD9wb4l+znKXeunwX1ZEKZkyspjmlWZ/tJjuZpqQ+tGEf513/DDd97m3992Bo6ujlG3euC/2j7+iJ9i/eB974wfNbD7Nmd3j/esLStXv4+OJ5aQHpUHsPd/s3Ogr7AwxbwqQnGqcnmtu1DAfbemls7krr5unqjSVNqw5bxiOTfa3d7Gvp5iePb0kqd1hX0v++tJcVIV1UV/95I2ceP5Njpk7oT/vbXzwPwJffezyxuCMaj1NTGaGmsoJ50yeyYvthpk+s7r+A86ePv8bWg16Ft+NQB5NrK/v/ZhJjPMHfiHOO//v7Vbx2oJ0PnXI0x86so6s3xqH2nqR7rmw50M6U2kpmT66hvSfK5NoqwPv7mTqhCucc97zYyPtPmsMR/wThSODaku6+GLVVydc0HfSXxnly80F+tGwz3/jQGwDvxOnhDfuZXFuZdmJz0U3L6Y3F+fL7jg+tC4KB9O4XG2jr7uOmzy1OywdegPrW/3hjXO97w2x+/um3MrE6vcqt39HErEk1/N3v6qmsqGDZP72Hw+09vO3qR7nyIyfz9oUzuPahTbz+qMmce8rR/WXujcbp6IlSGbHQ67kKwYrVP2dmZwLfdc59yH9+OYBz7ppAnmV+nhfMrBLYB8wGlgTzBvNler/Fixe7VatWDamsWw60EamoYNGsuiHtD94fyy3Ld/KbZ7cPmvcdx81g+bbi9tMGTaiKUBUxWkPO3HNVHanglLlTWBMyzXTRrDpicceulLOpWZOq+1sp5TR9YhVH/Epr3vQJSeM/1ZGK/gvdCu2oKTXsb01ev+u4WXVs8++eF7Y9k4nVkaSxm6kTqphRV41zrn9tqEyOm10Hjv73LbTjZ9fRE40nfa9zp03AOceh9t6k73f+jAnsa+mmL+aYM7mGSbVehbnNDzpTJ1TR0tXH8bPriMYdOw93ctSUGiorKtJarzPqqpk6oYqu3hj7Wrs5Zmpt0gKbh9p7+o97Lt/DsTMnstP/LudOm0BNlRfME43Jtu4oB9rSj9fRU2pp7e6jKlJBTWUFlRVGbVWE9p70/CfMmZT0PO5c/2cPlvNgW09oSztVYgr7uacczc8//dacp+0nv4atds6FRrmitSCAucDuwPMG4IxMeZxzUTNrAWb66ctT9p2b+gZmdilwKcCCBQuGXNAT5kwe8r4JC2fV8e2PnMy3P3IyfbE4e5u72bCnhcMdvRxq76Glq4/mzj52N3Xy3Y+ewtFTarlrdQPbDnXwckMLsbhjwYyJ3hlcVYSXGprp6InR2RvljEUz6eyN0hON0xuNc9HpC+iJxli3u4UV2w/zjuNm0tjcRV8szoSqCPtau3nDUVOorDD2tHTx5nnTaOvu49kth6iOVDCxppLthzp487yp7GrqojpinL5oBtG444lXDlAZqaAqUsEZx80gGvPOKE+bP43XTZvAQ+v38uyWw5w2fyqb9raxeOF0wGtBnDpvKrMn1VBXE2F3U1f/bVo7e6JMnVAF5rUG6qor2bi3lakTqjjS2UtrV5QzjpvBfWv3cMKcSRwztZa27ijzpk9gzuRath1qZ9fhTlq7o0yq8cpy37o9zJlcw9c+8HpWbm9i2YZ9RCqMd50wi+bOPv7h7BN4bNMBNu9rY87kGlZsb+Kdx88kFnecdHSUldsP87HT5tLU2QsOptdVMWdyLfOmT2Dd7mZau6Os3N7EsTMnUhWpYHJtJY9u2s/pi2YyfWIV9dubePP8aexq6qSzN0Zbdx8TqiO8ad40aisj7DzcwVFTa1mz8wgzJ9VQXVmBc45jpk2gurKCCdURjps1qb/7rn57EzPqqtl2sIPjZtfR0tXHvtZu3r5wBnMm1xB3jtauKBv2tBCpMN55/CwcXgWzYGYdU2oreXjjfuqqI8QdnH3SHM46YRZPvXqw/4yzszfGiUdNYk9zF0c6+6iKGL3+b+qEoyaz41AHM+qqqams4JV9bfzF3Ck0d/YxsTpCVaSCDXtaOe/UoznU3svK7U0smDGRWZOqOWaa1yI5akotJ86ZRE80juFdNDhrUg1HOnu5b+0e3rpgGnMm17JwZh2tXX0smlVHX8zhcFRHKphUU8mkWu+3edLRUwCvZXDa/GlUVlQQiztOmz+NuprK/skfMedV4K8daGf+9AlUBqahn3jUJOJxONzRQyzu+ss5c1I19TsGWp+VFcaZx89kRl01J86ZxLqGFt6yYBqQctFkX5x9rV3UVkaojBh7W7o5blYdVZEKqisrmFgdwTC6ozGvFeq87sfOniirdh7hvFOPDr2/SWdPjNdNq6WuppLaKq/1xjGw/VAHJ8yZxIptTd53VOm14hfOqmNmXQ1TJ1SxcW8LB9t6eP3Rk4cUHAZTzBbEBcC5zrm/859/FjjDOXdZIM96P0+D/3wrXhD5LrDcOXern/4b4EHn3F2Z3m84LQgRkfEqWwuimIPUjcD8wPN5flpoHr+LaSpwOMd9RUSkiIoZIOqBE81skZlV4w06L03JsxS42H98AfC485o0S4EL/VlOi4ATgcJe1SMiIlkVbQzCH1O4DFgGRICbnXMbzOwqYJVzbinwG+AWM9sCNOEFEfx8dwAbgSjwlWLPYBIRkWRFG4MoNY1BiIjkr1xjECIiMoopQIiISCgFCBERCaUAISIiocbMILWZHQTS16HO3SzgUIGKM1roM4994+3zgj5zvo51zs0O2zBmAsRwmdmqTCP5Y5U+89g33j4v6DMXkrqYREQklAKEiIiEUoAYcFO5C1AG+sxj33j7vKDPXDAagxARkVBqQYiISCgFCBERCTXuA4SZnWtmm81si5ktKXd5CsXM5pvZE2a20cw2mNlX/fQZZvaImb3m/z/dTzcz+4n/PbxkZm8t7ycYOjOLmNkaM/uz/3yRma3wP9uf/OXn8ZeT/5OfvsLMFpa14ENkZtPM7C4ze8XMNpnZmWP9OJvZP/m/6/Vm9kczqx1rx9nMbjazA/6N1RJpeR9XM7vYz/+amV0c9l6ZjOsAYWYR4Abgw8DJwEVmdnJ5S1UwUeCfnXMnA+8AvuJ/tiXAY865E4HH/OfgfQcn+v8uBX5R+iIXzFeBTYHn3weuc86dABwBLvHTLwGO+OnX+flGo+uBh5xzJwFvxvvsY/Y4m9lc4B+Bxc65v8C7ncCFjL3j/N/AuSlpeR1XM5sBfAfvTp2nA99JBJWcOOfG7T/gTGBZ4PnlwOXlLleRPut9wAeBzcAxftoxwGb/8Y3ARYH8/flG0z+8uw8+Brwf+DPeLYsPAZWpxxzvXiVn+o8r/XxW7s+Q5+edCmxPLfdYPs4M3Mt+hn/c/gx8aCweZ2AhsH6oxxW4CLgxkJ6Ub7B/47oFwcAPLaHBTxtT/Cb1W4AVwFHOub3+pn3AUf7jsfJd/BfwL0Dcfz4TaHbORf3nwc/V/5n97S1+/tFkEXAQ+K3frfZrM6tjDB9n51wj8CNgF7AX77itZmwf54R8j+uwjvd4DxBjnplNAu4Gvuacaw1uc94pxZiZ52xmHwEOOOdWl7ssJVQJvBX4hXPuLUAHA90OwJg8ztOBj+EFx9cBdaR3xYx5pTiu4z1ANALzA8/n+WljgplV4QWH25xz9/jJ+83sGH/7McABP30sfBdnAR81sx3A7XjdTNcD08wscXvd4Ofq/8z+9qnA4VIWuAAagAbn3Ar/+V14AWMsH+cPANudcwedc33APXjHfiwf54R8j+uwjvd4DxD1wIn+7IdqvIGupWUuU0GYmeHd83uTc+4/A5uWAomZDBfjjU0k0j/nz4Z4B9ASaMqOCs65y51z85xzC/GO5ePOuU8DTwAX+NlSP3Piu7jAzz+qzrSdc/uA3Wb2Bj/pbLx7uY/Z44zXtfQOM5vo/84Tn3nMHueAfI/rMuAcM5vut7zO8dNyU+5BmHL/A84DXgW2At8qd3kK+Lnehdf8fAlY6/87D6/v9THgNeBRYIaf3/BmdG0FXsabIVL2zzGMz/8+4M/+4+OAlcAW4E6gxk+v9Z9v8bcfV+5yD/Gzngas8o/1vcD0sX6cgX8HXgHWA7cANWPtOAN/xBtj6cNrKV4ylOMKfNH/7FuAL+RTBi21ISIiocZ7F5OIiGSgACEiIqEUIEREJJQChIiIhFKAEBGRUAoQIgViZleZ2QcK8DrthSiPyHBpmqvICGNm7c65SeUuh4haECJZmNlnzGylma01sxvNu9dEu5ld59+P4DEzm+3n/W8zu8B/fK159+J4ycx+5KctNLPH/bTHzGyBn77IzF4ws5fN7OqU9/+mmdX7+/x7qT+/jG8KECIZmNkbgU8CZznnTgNiwKfxFodb5Zw7BXgKb7394H4zgb8GTnHOvQlIVPo/BX7np90G/MRPvx5vsb1T8a6cTbzOOXjr+5+Od7X028zsPYX/pCLhFCBEMjsbeBtQb2Zr/efH4S0l/ic/z614y5oEtQDdwG/M7G+ATj/9TOAP/uNbAvudhbesQiI94Rz/3xrgReAkvIAhUhKVg2cRGbcM74z/8qREs2+n5EsayHPORc3sdLyAcgFwGd7KstmEDQYacI1z7sa8Si1SIGpBiGT2GHCBmc2B/vsBH4v3d5NYNfRTwLPBnfx7cEx1zj0A/BPebUABnsdbZRa8rqpn/MfPpaQnLAO+6L8eZjY3URaRUlALQiQD59xGM7sCeNjMKvBW1fwK3k15Tve3HcAbpwiaDNxnZrV4rYCv++n/gHfnt2/i3QXuC376V4E/mNm/MrB8M865h/1xkBe8Va1pBz7DwD0ARIpK01xF8qRpqDJeqItJRERCqQUhIiKh1IIQEZFQChAiIhJKAUJEREIpQIiISCgFCBERCfX/AYzmlxr2iVboAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from dezero import Model\n",
    "from dezero import optimizers\n",
    "import dezero.functions as F\n",
    "import dezero.layers as L\n",
    "from dezerogym.gridworld import GridWorld\n",
    "\n",
    "\n",
    "def one_hot(state):\n",
    "    HEIGHT, WIDTH = 3, 4\n",
    "    vec = np.zeros(HEIGHT * WIDTH, dtype=np.float32)\n",
    "    y, x = state\n",
    "    idx = WIDTH * y + x\n",
    "    vec[idx] = 1.0\n",
    "    return vec[np.newaxis, :]\n",
    "\n",
    "\n",
    "class QNet(Model):\n",
    "    def __init__(self):\n",
    "        super().__init__()\n",
    "        self.l1 = L.Linear(100)  # hidden_size\n",
    "        self.l2 = L.Linear(4)  # action_size\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = F.relu(self.l1(x))\n",
    "        x = self.l2(x)\n",
    "        return x\n",
    "\n",
    "\n",
    "class QLearningAgent:\n",
    "    def __init__(self):\n",
    "        self.gamma = 0.9\n",
    "        self.lr = 0.01\n",
    "        self.epsilon = 0.1\n",
    "        self.action_size = 4\n",
    "\n",
    "        self.qnet = QNet()\n",
    "        self.optimizer = optimizers.SGD(self.lr)\n",
    "        self.optimizer.setup(self.qnet)\n",
    "\n",
    "    def get_action(self, state_vec):\n",
    "        if np.random.rand() < self.epsilon:\n",
    "            return np.random.choice(self.action_size)\n",
    "        else:\n",
    "            qs = self.qnet(state_vec)\n",
    "            return qs.data.argmax()\n",
    "\n",
    "    def update(self, state, action, reward, next_state, done):\n",
    "        if done:\n",
    "            next_q = np.zeros(1)  # [0.]\n",
    "        else:\n",
    "            next_qs = self.qnet(next_state)\n",
    "            next_q = next_qs.max(axis=1)\n",
    "            next_q.unchain()\n",
    "\n",
    "        target = self.gamma * next_q + reward\n",
    "        qs = self.qnet(state)\n",
    "        q = qs[:, action]\n",
    "        loss = F.mean_squared_error(target, q)\n",
    "\n",
    "        self.qnet.cleargrads()\n",
    "        loss.backward()\n",
    "        self.optimizer.update()\n",
    "\n",
    "        return loss.data\n",
    "\n",
    "\n",
    "env = GridWorld()\n",
    "agent = QLearningAgent()\n",
    "\n",
    "episodes = 1000\n",
    "loss_history = []\n",
    "\n",
    "for episode in range(episodes):\n",
    "    state = env.reset()\n",
    "    state = one_hot(state)\n",
    "    total_loss, cnt = 0, 0\n",
    "    done = False\n",
    "\n",
    "    while not done:\n",
    "        action = agent.get_action(state)\n",
    "        next_state, reward, done = env.step(action)\n",
    "        next_state = one_hot(next_state)\n",
    "\n",
    "        loss = agent.update(state, action, reward, next_state, done)\n",
    "        total_loss += loss\n",
    "        cnt += 1\n",
    "        state = next_state\n",
    "\n",
    "    average_loss = total_loss / cnt\n",
    "    loss_history.append(average_loss)\n",
    "\n",
    "\n",
    "plt.xlabel('episode')\n",
    "plt.ylabel('loss')\n",
    "plt.plot(range(len(loss_history)), loss_history)\n",
    "plt.show()\n",
    "\n",
    "# visualize\n",
    "Q = {}\n",
    "for state in env.states():\n",
    "    for action in env.action_space:\n",
    "        q = agent.qnet(one_hot(state))[:, action]\n",
    "        Q[state, action] = float(q.data)\n",
    "env.render_q(Q)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
